// 对axios进行二次封装
// axios本身是一个独立的库 是对ajax的封装 为了方便项目中使用 我们对他进行二次封装
// (1)接口j基地址
// (2)请求响应拦截器
import axios from 'axios'
// 在普通js文件中想要访问vuex的数据 直接引入store
import store from '@/store/index.js'
// 在一个普通得模块中去获取vuex得值
// 直接import
import JSONBig from 'json-bigint' // 引入大数据包
import router from '../router'
const instance1 = axios.create({
  // 主接口
  baseURL: 'http://ttapi.research.itcast.cn',
  transformResponse: [function (data) {
    // 由于后端返回得数据有出现大数问题(文章编号)，这里使用json-bigint处理一下
    // 优先使用jsonbig转一下
    try {
      return JSONBig.parse(data)
    } catch (err) {
      return data
    }
  }]
})
// 备用接口
const instance2 = axios.create({
  // 主接口
  baseURL: 'http://api-toutiao-web.itheima.net'
})
// 添加请求拦截器
instance1.interceptors.request.use(function (config) {
  // 在发送请求前 先看看vuex中是否有ttoken 如果有就就加到header中
  const token = store.state.tokenInfo.token
  if (token) {
    // 有就加到header上
    // 后端要求headers后有空格
    config.headers.Authorization = `Bearer ${token}`
  }
  return config
}, function (err) {
  return Promise.reject(err)
})
// 添加相应拦截器
instance1.interceptors.response.use(function (response) {
  // 对响应数据做出反应
  return response
}, async function (error) {
  console.log('相应拦截器错误')
  console.dir(error)
  if (error.response && error.response.status === 401) {
    const refreshToken = store.state.tokenInfo.refreshToken
    if (refreshToken) {
      try {
        // 使用refreshToken 发送请求 请求新的token值
        const res = await axios({
          method: 'PUT',
          url: 'http://ttapi.research.itcast.cn/app/v1_0/authorizations ',
          headers: {
            Authorization: `Bearer ${refreshToken}`
          }
        })
        // 取回一个新token 保存到本地 vuex中
        const newToken = res.data.data.token

        // 保存到vuex中
        store.commit('mSetToken', {
          token: newToken,
          refresh_token: refreshToken
        })
        // 重新发送请求
        return instance1(error.config)
      } catch (err) {
        // 请求失败跳转登录页
        router.push('/login?jumpto=' + router.currentRoute.fullPath)
      }
    } else {
      // 没有refreshtoken 那么跳转到登录页 携带路由信息
      router.push('/login?jumpto=' + router.currentRoute.fullPath)
    }
  } else {
    // 如果不是token过期 那么就返回cuowu
    return Promise.reject(error)
  }
})

export { instance1, instance2 }

// 默认导出接口一
export default instance1
